<!DOCTYPE HTML>
<html>

<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>第 3 页 | backend | DeepThought</title>
  <meta name="google-site-verification" content="Ei6mmDdf-cJwox1RvJOeX8Dc720fqWjZQu-Ww2BjBt4">
  
  <meta name="author" content="积慕">
  
  <meta name="description" content="个人博客知识分享,知识需沉淀,更需分享">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:site_name" content="DeepThought">

  
  <meta property="og:image" content>
  

  <link href="https://pic.zhuliang.ltd/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <link rel="alternate" href="/atom.xml" title="DeepThought" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">

  <link rel="stylesheet" href="//at.alicdn.com/t/font_1187293_8fec2ou5fyx.css">

  <!-- <link rel="stylesheet" href="//cdn.bootcss.com/highlight.js/9.6.0/styles/github.min.css"> -->
  <!-- <script src="//cdn.bootcss.com/highlight.js/9.6.0/highlight.min.js"></script> -->
  <script src="/js/highlight.min.js"></script>

  <link rel="stylesheet" href="/css/markdown.css">

  <script src="/js/av-min.3.0.4.js"></script>
  <script src="/js/Valine.min.1.3.6.js"></script>

</head></html>

<body>
  <header id="header" class="inner"><div class="alignleft">
  <h1><a href="/">DeepThought</a></h1>
  <h2><a href="/">知识需沉淀，更需分享</a></h2>
</div>
<nav id="main-nav" class="alignright">
  <ul>
    
      <li><a href="/">首页</a></li>
    
      <li><a href="/about">关于我</a></li>
    
      <li><a href="/atom.xml">订阅RSS</a></li>
    
  </ul>
  <div class="clearfix"></div>
</nav>
<div class="clearfix"></div>
        </header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper">
<h2  style="background:#fff; border-bottom: 1px solid #ddd; padding-bottom:17.5px; padding-top:17.5px; padding-left:5px;margin-bottom: 0px;color:#999;font-weight:normal;text-shadow:0 0 1px #fff;">
  <i class="iconfont  icon-category" style="margin-right:5px;"></i>
   分类：backend</h2>


  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Writing-analyzers.html">Elasticsearch.Nest 教程系列 6-1 分析：Writing analyzers | 编写分析器</a></h1>
  


      
        <time datetime="2020-01-20T08:30:01.000Z">
          create: 2020-01-20 16:30:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.3k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;5&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<blockquote>
<p>ES 中的“分析”是指将文本（如任何电子邮件的正文）转换为 tokens 或 terms 的过程，这些  tokens 或 terms 被添加到倒排索引中以进行搜索。分析是由分析器执行的，该分析器可以是内置分析器，也可以是自定义的分析器。</p>
</blockquote>
<p><strong>分词器由 3 部分组成：</strong></p>
<ul>
<li>Character Filters：处理原始文本，如去除 html。<ul>
<li>一般有 0 个或多个</li>
</ul>
</li>
<li>Tokenizer：按照规则切分为单词。<ul>
<li>一般只有 1 个</li>
</ul>
</li>
<li>Token filter：加工切分后的单词，如转小写、删除停用词，增加同义词等。<ul>
<li>一般有 0 个或多个<br><img src="https://pic.zhuliang.ltd/20190918145432.png-c" alt></li>
</ul>
</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Writing-analyzers.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Ingest-Pipelines.html">Elasticsearch.Nest 教程系列 5-3 索引：Ingest Pipeline | Ingest 管道</a></h1>
  


      
        <time datetime="2020-01-20T07:27:01.000Z">
          create: 2020-01-20 15:27:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;5&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>Ingest 管道是一系列按照声明的顺序执行的处理器。</p>
<p><strong>假设有以下 POCO 类：</strong></p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string IpAddress { get; set; }
    public GeoIp GeoIp { get; set; }
}

public class GeoIp
{
    public string CityName { get; set; }
    public string ContinentName { get; set; }
    public string CountryIsoCode { get; set; }
    public GeoLocation Location { get; set; }
    public string RegionName { get; set; }
}
</code></pre>
<p><strong>创建一个 Ingestion 管道：</strong><br>eg：假设为 Person 文档建立索引，创建一个 Ingestion 管道，在被索引到 ES 之前对其进行相关操作：</p>
<ul>
<li>将 LastName 转换为大写</li>
<li>将姓名的首字母索引到其他字段—这里用 initials 字段</li>
<li>将 IpAddress 转换为具体地址。</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Ingest-Pipelines.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Ingest-Node.html">Elasticsearch.Nest 教程系列 5-2 索引：Ingest Node | 使用 Ingest 节点</a></h1>
  


      
        <time datetime="2020-01-20T06:56:01.000Z">
          create: 2020-01-20 14:56:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;585&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;2&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<h1 id="Ingest-Node-的作用"><a href="#Ingest-Node-的作用" class="headerlink" title="Ingest Node 的作用"></a>Ingest Node 的作用</h1><p>在文档索引发生之前，会使用 Ingest 节点进行预处理文档。Ingest 节点会拦截批量和索引请求，之后应用转换（mapping），然后将文档传递回索引或 Bulk API。</p>
<ul>
<li>即：在数据被索引之前，通过预定义好的处理管道对数据进行预处理。</li>
</ul>
<p>默认情况下，所有节点都启用 Ingest，也就是说任何节点都可以处理 Ingest 任务。</p>
<ul>
<li>当然，你也可以创建某些业务专用的 Ingest 节点。</li>
</ul>
<p>Elasticsearch 会将自动将索引请求重新路由到 Ingest 节点，而您可以优化此路径。</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Ingest-Node.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Indexing.html">Elasticsearch.Nest 教程系列 5-1 索引：Indexing | 索引（添加）文档</a></h1>
  


      
        <time datetime="2020-01-20T02:47:01.000Z">
          create: 2020-01-20 10:47:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.9k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;9&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<blockquote>
<p>索引（Indexing）：是指讲文档添加到 ES 中的过程，目前 Nest 提供了以下 3 种 Indexing 方式：</p>
<ul>
<li>Indexing Documents</li>
<li>Ingest Node</li>
<li>Ingest Pipelines </li>
</ul>
</blockquote>
<p><strong>NEST 提供了多种索引文档的方式：</strong></p>
<p>假设有 Person 类：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Indexing.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-multifields.html">Elasticsearch.Nest 教程系列 4-7 映射：Multi fields | 多字段映射</a></h1>
  


      
        <time datetime="2020-01-19T09:43:01.000Z">
          create: 2020-01-19 17:43:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;720&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>在 ES 中，多字段映射是很有用的，如：</p>
<ul>
<li>一个 string 类型的属性会被推断为 ES 的 包含 keyword 子字段的 text 数据类型，其中： <ul>
<li>text 数据类型适用于全文搜索。</li>
<li>keyword 适用于结构搜索、排序以及聚合。</li>
</ul>
</li>
<li>另外多字段映射适用于不同的分析器，以满足不同的全文本搜索需求。</li>
</ul>
<p>假设有如下模型类：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class Person
{
    public string Name { get; set; }
}
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-multifields.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Ignoring-properties.html">Elasticsearch.Nest 教程系列 4-6 映射：Ignoring properties | 映射时忽略 POCO 上的某些属性</a></h1>
  


      
        <time datetime="2020-01-19T09:00:01.000Z">
          create: 2020-01-19 17:00:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;730&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>POCO 类属性进行映射时，可以通过以下几种方式忽略部分属性</p>
<ul>
<li>在使用继承了 ElasticsearchPropertyAttributeBase 的各特性上使用 Ignore 属性：如在使用 TextAttribute 时，使用 Ingore 属性进行属性忽略。</li>
<li>在使用 PropertyNameAttribute 的时候使用Ignore属性。</li>
<li>使用 ConnectionSettings.DefaultMappingFor<tdocument>(Func&lt;ClrTypeMappingDescriptor<tdocument>,<br>IClrTypeMapping<tdocument>&gt; selector) 方法的时候进行指定需要忽略的属性。</tdocument></tdocument></tdocument></li>
<li>使用能够被 IElasticsearchSerializer 识别的 Ignore 特性，内建的 SourceSerializer 可以使用 [IgnoreAttribute] 进行忽略。</li>
</ul>
<h1 id="忽略类中的部分属性"><a href="#忽略类中的部分属性" class="headerlink" title="忽略类中的部分属性"></a>忽略类中的部分属性</h1><p>示例: </p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Ignoring-properties.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-Routing-inference.html">Elasticsearch.Nest 教程系列 9-8 转换：Routing Inference | 路由推断</a></h1>
  


      
        <time datetime="2020-01-17T07:20:01.000Z">
          create: 2020-01-17 15:20:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;795&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>有的时候，我们在索引文档的时候，会要求指定 routing，否则会报“[routing] is missing for ….”之类的错误，ES 原生直接通过 ?routing 的形式来进行指定，如：</p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">PUT /index/_doc/1?routing=1  
{
    &quot;parentProperty&quot;: &quot;a parent prop&quot;,
    &quot;id&quot;: 1,
    &quot;parentChildRelation&quot;: {
        &quot;name&quot;:&quot;myparent&quot;
    }
}
</code></pre>
<p>那么在 NEST 中，如何指定 routing？NEST 提供了以下几种方法：</p>
<h1 id="隐式转换"><a href="#隐式转换" class="headerlink" title="隐式转换"></a>隐式转换</h1><p>以下数据类型会自动进行隐式转换来显式创建路由：</p>
<ul>
<li>Int32</li>
<li>Int64</li>
<li>String</li>
<li>Guid </li>
</ul>
<p>以上几个数据类型，在被声明为 Routing 类型的 方法/属性使用的时候，会自动进行隐式转换——转换成 Routing 类型，如下：</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-Routing-inference.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-parent-child-relationships.html">Elasticsearch.Nest 教程系列 4-5 映射：Parent/Child relationships | 子父级关系映射</a></h1>
  


      
        <time datetime="2020-01-16T08:27:01.000Z">
          create: 2020-01-16 16:27:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;2.4k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;10&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<blockquote>
<p><strong>如果把 <a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/parent-child-relationships.html" target="_blank" rel="noopener">官方示例</a> 放在你本地进行测试，会发现没有问题，但当你连接测试 ES 服务器的时候，就会报各种错误：</strong></p>
<ul>
<li>这是因为官方使用了 InMemoryConnection ，所有请求并不会真实发送到测试 ES 服务器，规避掉了不少现实问题。以下示例基于官方文档进行了修正，使用本地搭建测试 ES 服务器。 </li>
</ul>
</blockquote>
<p>父子关系的数据结构，在日常开发过程中，使用还是比较平凡的：</p>
<ul>
<li>在 ES 6.x 之前，你可以在一个索引中包含多种 type(类型)。通过给定类型的特殊 _parent 字段映射，可以创建 1对N 关系 的父-子文档。<ul>
<li>通过这种方式在索引子项时，你需要传递一个 _parent id 作为路由键（<strong>需要确保父项、其子项及所有祖先都保存在同一个分片上</strong>）。</li>
</ul>
</li>
<li>但从 ES 6.x 开始，type 不再支持多类型，固定  _type=_doc。（另外在 ES5 的时候，ES 的 index 相当于 DB，_type 相当于 DB 中的表名，但从 ES7 开始，ES 的 index 相当于 DB中的表，_type 固定为 _doc）</li>
</ul>
<p>嵌套对象和父子结构文档的差异对比和使用建议：</p>
<table>
<thead>
<tr>
<th></th>
<th>Nested Object</th>
<th>Parent/Child</th>
</tr>
</thead>
<tbody>
<tr>
<td>优点</td>
<td>文档存储再一起，读取性能高</td>
<td>父子文档可以独立更新</td>
</tr>
<tr>
<td>缺点</td>
<td>更新嵌套的子文档时，需要更新整个文档</td>
<td>需要额外的内存维护关系。读取性能相对差</td>
</tr>
<tr>
<td>适用场景</td>
<td>子文档偶尔更新，以查询为主</td>
<td>子文档更新频繁</td>
</tr>
</tbody>
</table>
<p>既然索引不再允许将不同 _type 类型存储在同一索引中，那么如何创建父联接？</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-parent-child-relationships.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-visitor-pattern.html">Elasticsearch.Nest 教程系列 4-4 映射：through the Visitor Pattern | 通过访问者模式进行映射</a></h1>
  


      
        <time datetime="2020-01-16T07:55:01.000Z">
          create: 2020-01-16 15:55:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;821&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;4&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>通过访问者模式，可以对所有或者特定的属性进行应用转换。 </p>
<p>.AutoMap() 方法内部实现了 <a href="https://en.wikipedia.org/wiki/Visitor_pattern" target="_blank" rel="noopener">Visitor Pattern</a>，默认访问者 NoopPropertyVisitor 不执行任何操作，并允许你实现自己的访问方法。</p>
<p><strong>常规使用：</strong></p>
<p>示例：自定义一个访问者，以禁用数字和布尔类型的 doc 值：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Salary { get; set; }
    public DateTime Birthday { get; set; }
    public bool IsManager { get; set; }
    public List&lt;Employee&gt; Employees { get; set; }
    public TimeSpan Hours { get; set; }
}
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-visitor-pattern.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-fluentmapping.html">Elasticsearch.Nest 教程系列 4-3 映射：Fluent mapping | 通过 lambda 表达式流畅映射</a></h1>
  


      
        <time datetime="2020-01-16T06:49:01.000Z">
          create: 2020-01-16 14:49:01 | update: 2020-01-23 12:15:44
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.4k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;7&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>Fluent mapping 允许你可以最大程度地控制 POCOs 到 ES 字段的映射。你可以认为这种方式类似于 Automapper 中通过 CreateMap&lt;T1, T2&gt;().ForMember 来显式指定属性之间的映射。Fluent mapping 同样需要你显式指定每一个 POCO 属性跟 ES 字段的映射关系。</p>
<p>下面使用 Company 和 Employee 这 2 个 类来进行演示，两者之间的关系如下：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class Company
{
    public string Name { get; set; }
    public List&lt;Employee&gt; Employees { get; set; }
}

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Salary { get; set; }
    public DateTime Birthday { get; set; }
    public bool IsManager { get; set; }
    public List&lt;Employee&gt; Employees { get; set; }
    public TimeSpan Hours { get; set; }
}
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-fluentmapping.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  

  <nav id="pagination">
  
    <a href="/categories/backend/page/2/" class="alignleft prev">上一页</a>
  
  
    <a href="/categories/backend/page/4/" class="alignright next">下一页</a>
  
  <div class="clearfix"></div>
</nav>
</div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-category"></i>&nbsp;&nbsp;分类</h3>
  <ul class="entry">
  
    <li><a href="/categories/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/categories/PowerUser/">PowerUser</a><small>4</small></li>
  
    <li><a href="/categories/backend/">backend</a><small>57</small></li>
  
    <li><a href="/categories/frontend/">frontend</a><small>9</small></li>
  
    <li><a href="/categories/operations/">operations</a><small>5</small></li>
  
    <li><a href="/categories/提前退休/">提前退休</a><small>2</small></li>
  
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-new3"></i>&nbsp;&nbsp;最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2024/11/PowerUser/install-docker-in-pve-lxc.html">1. 通过 PVE LXC 搭建 docker 环境</a>
      </li>
    
      <li>
        <a href="/2024/11/Obsidian/obsidian-render-pie-chart.html">2. 2 套用于 obsidian 的生成时间占用饼图脚本示例，基于 templater， charts，echarts+dataview</a>
      </li>
    
      <li>
        <a href="/2024/10/PowerUser/fix-ios18-samba-readonly-issue.html">3. 解决 ios 18（包括ipadOS 18） 下通过文件(files app)连接 samba 服务器，目录变成只读权限的问题</a>
      </li>
    
      <li>
        <a href="/2023/07/operations/how-to-use-pm2.html">4. PM2 的安装、配置和使用</a>
      </li>
    
      <li>
        <a href="/2023/07/backend/expose-intranet-netcoreapi-to-internet.html">5. 通过 DDNS+显性URL 把内网部署的.NET CORE WEBAPI 项目暴露到公网中</a>
      </li>
    
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-tag"></i>&nbsp;&nbsp;标签</h3>
  <ul class="entry">
  
    <li><a href="/tags/net-core/">.net core</a><small>12</small></li>
  
    <li><a href="/tags/Debian/">Debian</a><small>2</small></li>
  
    <li><a href="/tags/Docker/">Docker</a><small>1</small></li>
  
    <li><a href="/tags/Elasticsearch/">Elasticsearch</a><small>35</small></li>
  
    <li><a href="/tags/Elasticsearch-Nest系列/">Elasticsearch.Nest系列</a><small>35</small></li>
  
    <li><a href="/tags/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/tags/PVE/">PVE</a><small>2</small></li>
  
    <li><a href="/tags/StackExchange-Redis系列/">StackExchange.Redis系列</a><small>12</small></li>
  
    <li><a href="/tags/centos/">centos</a><small>3</small></li>
  
    <li><a href="/tags/flex/">flex</a><small>1</small></li>
  
    <li><a href="/tags/ios/">ios</a><small>1</small></li>
  
    <li><a href="/tags/javascript/">javascript</a><small>1</small></li>
  
    <li><a href="/tags/linux/">linux</a><small>4</small></li>
  
    <li><a href="/tags/nginx/">nginx</a><small>2</small></li>
  
    <li><a href="/tags/nuget/">nuget</a><small>2</small></li>
  
    <li><a href="/tags/react/">react</a><small>6</small></li>
  
    <li><a href="/tags/styled-components/">styled-components</a><small>1</small></li>
  
    <li><a href="/tags/内网穿透/">内网穿透</a><small>4</small></li>
  
    <li><a href="/tags/培训讲义/">培训讲义</a><small>2</small></li>
  
    <li><a href="/tags/基础知识/">基础知识</a><small>2</small></li>
  
    <li><a href="/tags/性能优化/">性能优化</a><small>2</small></li>
  
    <li><a href="/tags/教程/">教程</a><small>64</small></li>
  
    <li><a href="/tags/理财/">理财</a><small>2</small></li>
  
    <li><a href="/tags/生命周期/">生命周期</a><small>1</small></li>
  
    <li><a href="/tags/经验/">经验</a><small>4</small></li>
  
  </ul>
</div>


  
  <script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
  <script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
  <div class="widget tag">
    <h3 class="title"><i class="iconfont icon-cloud1"></i>&nbsp;&nbsp;标签云</h3>
    <div id="myCanvasContainer" class="widget tagcloud">
      <canvas width="250" height="250" id="resCanvas" style="width:100%">
        <a href="/tags/net-core/" style="font-size: 17.14px;">.net core</a> <a href="/tags/Debian/" style="font-size: 11.43px;">Debian</a> <a href="/tags/Docker/" style="font-size: 10px;">Docker</a> <a href="/tags/Elasticsearch/" style="font-size: 18.57px;">Elasticsearch</a> <a href="/tags/Elasticsearch-Nest系列/" style="font-size: 18.57px;">Elasticsearch.Nest系列</a> <a href="/tags/Obsidian/" style="font-size: 10px;">Obsidian</a> <a href="/tags/PVE/" style="font-size: 11.43px;">PVE</a> <a href="/tags/StackExchange-Redis系列/" style="font-size: 17.14px;">StackExchange.Redis系列</a> <a href="/tags/centos/" style="font-size: 12.86px;">centos</a> <a href="/tags/flex/" style="font-size: 10px;">flex</a> <a href="/tags/ios/" style="font-size: 10px;">ios</a> <a href="/tags/javascript/" style="font-size: 10px;">javascript</a> <a href="/tags/linux/" style="font-size: 14.29px;">linux</a> <a href="/tags/nginx/" style="font-size: 11.43px;">nginx</a> <a href="/tags/nuget/" style="font-size: 11.43px;">nuget</a> <a href="/tags/react/" style="font-size: 15.71px;">react</a> <a href="/tags/styled-components/" style="font-size: 10px;">styled-components</a> <a href="/tags/内网穿透/" style="font-size: 14.29px;">内网穿透</a> <a href="/tags/培训讲义/" style="font-size: 11.43px;">培训讲义</a> <a href="/tags/基础知识/" style="font-size: 11.43px;">基础知识</a> <a href="/tags/性能优化/" style="font-size: 11.43px;">性能优化</a> <a href="/tags/教程/" style="font-size: 20px;">教程</a> <a href="/tags/理财/" style="font-size: 11.43px;">理财</a> <a href="/tags/生命周期/" style="font-size: 10px;">生命周期</a> <a href="/tags/经验/" style="font-size: 14.29px;">经验</a>
      </canvas>
    </div>
  </div>




</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">

  
  &copy; 2018 - 2024 &nbsp;<a href='/about'>积慕</a>
  
  &nbsp;&nbsp;<a href='https://www.cnblogs.com/deepthought/'>我的博客园地址</a>
  &nbsp;&nbsp;finalclassic#outlook.com
</div>

<div class="clearfix"></div>
<div>
  本站主题基于：<a href='https://github.com/hexojs/hexo-theme-light' rel="external nofollow">hexo-theme-light</a>
</div>
<div id="busuanzi_container_site_pv">
  本站总访问量&nbsp;<span id="busuanzi_value_site_pv"></span>&nbsp;次
</div>
<div style="width:300px;margin:0 auto; padding:20px 0;">
  <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011702004805" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
    <img src="https://pic.zhuliang.ltd/20200102164648.png" style="float:left;"><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">沪公网安备 31011702004805号</p></a>
</div></footer>
  <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>




<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
  $('.fancybox').fancybox();
})(jQuery);
</script>


<script type="text/javascript">
hljs.initHighlightingOnLoad();
</script>

<!-- <script src="/js/busuanzi.pure.mini.js"></script> -->
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script>
    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?ea793b9c8d6b31df666a6bc15038e246";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
</body>
</html>
